/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Control;

import Control.exceptions.NonexistentEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import Entidades.Ordenreparacion;
import Entidades.Clientemayorista;
import Entidades.Modelo;
import Entidades.Gamaequipo;
import Entidades.Equipofalla;
import java.util.ArrayList;
import java.util.List;
import Entidades.Empleadoequipo;
import Entidades.Equipo;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author luksCastro
 */
public class EquipoJpaController implements Serializable {

    public EquipoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Equipo equipo) {
        if (equipo.getEquipofallaList() == null) {
            equipo.setEquipofallaList(new ArrayList<Equipofalla>());
        }
        if (equipo.getEmpleadoequipoList() == null) {
            equipo.setEmpleadoequipoList(new ArrayList<Empleadoequipo>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Ordenreparacion ordenreparacionidOrdenRep = equipo.getOrdenreparacionidOrdenRep();
            if (ordenreparacionidOrdenRep != null) {
                ordenreparacionidOrdenRep = em.getReference(ordenreparacionidOrdenRep.getClass(), ordenreparacionidOrdenRep.getIdOrdenRep());
                equipo.setOrdenreparacionidOrdenRep(ordenreparacionidOrdenRep);
            }
            Clientemayorista clienteMayoristaidClienteMay = equipo.getClienteMayoristaidClienteMay();
            if (clienteMayoristaidClienteMay != null) {
                clienteMayoristaidClienteMay = em.getReference(clienteMayoristaidClienteMay.getClass(), clienteMayoristaidClienteMay.getIdClienteMay());
                equipo.setClienteMayoristaidClienteMay(clienteMayoristaidClienteMay);
            }
            Modelo modeloidModelo = equipo.getModeloidModelo();
            if (modeloidModelo != null) {
                modeloidModelo = em.getReference(modeloidModelo.getClass(), modeloidModelo.getIdModelo());
                equipo.setModeloidModelo(modeloidModelo);
            }
            Gamaequipo gamaequipoidGama = equipo.getGamaequipoidGama();
            if (gamaequipoidGama != null) {
                gamaequipoidGama = em.getReference(gamaequipoidGama.getClass(), gamaequipoidGama.getIdGama());
                equipo.setGamaequipoidGama(gamaequipoidGama);
            }
            List<Equipofalla> attachedEquipofallaList = new ArrayList<Equipofalla>();
            for (Equipofalla equipofallaListEquipofallaToAttach : equipo.getEquipofallaList()) {
                equipofallaListEquipofallaToAttach = em.getReference(equipofallaListEquipofallaToAttach.getClass(), equipofallaListEquipofallaToAttach.getIdequipoFalla());
                attachedEquipofallaList.add(equipofallaListEquipofallaToAttach);
            }
            equipo.setEquipofallaList(attachedEquipofallaList);
            List<Empleadoequipo> attachedEmpleadoequipoList = new ArrayList<Empleadoequipo>();
            for (Empleadoequipo empleadoequipoListEmpleadoequipoToAttach : equipo.getEmpleadoequipoList()) {
                empleadoequipoListEmpleadoequipoToAttach = em.getReference(empleadoequipoListEmpleadoequipoToAttach.getClass(), empleadoequipoListEmpleadoequipoToAttach.getIdEmpEq());
                attachedEmpleadoequipoList.add(empleadoequipoListEmpleadoequipoToAttach);
            }
            equipo.setEmpleadoequipoList(attachedEmpleadoequipoList);
            em.persist(equipo);
            if (ordenreparacionidOrdenRep != null) {
                ordenreparacionidOrdenRep.getEquipoList().add(equipo);
                ordenreparacionidOrdenRep = em.merge(ordenreparacionidOrdenRep);
            }
            if (clienteMayoristaidClienteMay != null) {
                clienteMayoristaidClienteMay.getEquipoList().add(equipo);
                clienteMayoristaidClienteMay = em.merge(clienteMayoristaidClienteMay);
            }
            if (modeloidModelo != null) {
                modeloidModelo.getEquipoList().add(equipo);
                modeloidModelo = em.merge(modeloidModelo);
            }
            if (gamaequipoidGama != null) {
                gamaequipoidGama.getEquipoList().add(equipo);
                gamaequipoidGama = em.merge(gamaequipoidGama);
            }
            for (Equipofalla equipofallaListEquipofalla : equipo.getEquipofallaList()) {
                Equipo oldIdEquipoOfEquipofallaListEquipofalla = equipofallaListEquipofalla.getIdEquipo();
                equipofallaListEquipofalla.setIdEquipo(equipo);
                equipofallaListEquipofalla = em.merge(equipofallaListEquipofalla);
                if (oldIdEquipoOfEquipofallaListEquipofalla != null) {
                    oldIdEquipoOfEquipofallaListEquipofalla.getEquipofallaList().remove(equipofallaListEquipofalla);
                    oldIdEquipoOfEquipofallaListEquipofalla = em.merge(oldIdEquipoOfEquipofallaListEquipofalla);
                }
            }
            for (Empleadoequipo empleadoequipoListEmpleadoequipo : equipo.getEmpleadoequipoList()) {
                Equipo oldEquipoidEquipoOfEmpleadoequipoListEmpleadoequipo = empleadoequipoListEmpleadoequipo.getEquipoidEquipo();
                empleadoequipoListEmpleadoequipo.setEquipoidEquipo(equipo);
                empleadoequipoListEmpleadoequipo = em.merge(empleadoequipoListEmpleadoequipo);
                if (oldEquipoidEquipoOfEmpleadoequipoListEmpleadoequipo != null) {
                    oldEquipoidEquipoOfEmpleadoequipoListEmpleadoequipo.getEmpleadoequipoList().remove(empleadoequipoListEmpleadoequipo);
                    oldEquipoidEquipoOfEmpleadoequipoListEmpleadoequipo = em.merge(oldEquipoidEquipoOfEmpleadoequipoListEmpleadoequipo);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Equipo equipo) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Equipo persistentEquipo = em.find(Equipo.class, equipo.getIdEquipo());
            Ordenreparacion ordenreparacionidOrdenRepOld = persistentEquipo.getOrdenreparacionidOrdenRep();
            Ordenreparacion ordenreparacionidOrdenRepNew = equipo.getOrdenreparacionidOrdenRep();
            Clientemayorista clienteMayoristaidClienteMayOld = persistentEquipo.getClienteMayoristaidClienteMay();
            Clientemayorista clienteMayoristaidClienteMayNew = equipo.getClienteMayoristaidClienteMay();
            Modelo modeloidModeloOld = persistentEquipo.getModeloidModelo();
            Modelo modeloidModeloNew = equipo.getModeloidModelo();
            Gamaequipo gamaequipoidGamaOld = persistentEquipo.getGamaequipoidGama();
            Gamaequipo gamaequipoidGamaNew = equipo.getGamaequipoidGama();
            List<Equipofalla> equipofallaListOld = persistentEquipo.getEquipofallaList();
            List<Equipofalla> equipofallaListNew = equipo.getEquipofallaList();
            List<Empleadoequipo> empleadoequipoListOld = persistentEquipo.getEmpleadoequipoList();
            List<Empleadoequipo> empleadoequipoListNew = equipo.getEmpleadoequipoList();
            if (ordenreparacionidOrdenRepNew != null) {
                ordenreparacionidOrdenRepNew = em.getReference(ordenreparacionidOrdenRepNew.getClass(), ordenreparacionidOrdenRepNew.getIdOrdenRep());
                equipo.setOrdenreparacionidOrdenRep(ordenreparacionidOrdenRepNew);
            }
            if (clienteMayoristaidClienteMayNew != null) {
                clienteMayoristaidClienteMayNew = em.getReference(clienteMayoristaidClienteMayNew.getClass(), clienteMayoristaidClienteMayNew.getIdClienteMay());
                equipo.setClienteMayoristaidClienteMay(clienteMayoristaidClienteMayNew);
            }
            if (modeloidModeloNew != null) {
                modeloidModeloNew = em.getReference(modeloidModeloNew.getClass(), modeloidModeloNew.getIdModelo());
                equipo.setModeloidModelo(modeloidModeloNew);
            }
            if (gamaequipoidGamaNew != null) {
                gamaequipoidGamaNew = em.getReference(gamaequipoidGamaNew.getClass(), gamaequipoidGamaNew.getIdGama());
                equipo.setGamaequipoidGama(gamaequipoidGamaNew);
            }
            List<Equipofalla> attachedEquipofallaListNew = new ArrayList<Equipofalla>();
            for (Equipofalla equipofallaListNewEquipofallaToAttach : equipofallaListNew) {
                equipofallaListNewEquipofallaToAttach = em.getReference(equipofallaListNewEquipofallaToAttach.getClass(), equipofallaListNewEquipofallaToAttach.getIdequipoFalla());
                attachedEquipofallaListNew.add(equipofallaListNewEquipofallaToAttach);
            }
            equipofallaListNew = attachedEquipofallaListNew;
            equipo.setEquipofallaList(equipofallaListNew);
            List<Empleadoequipo> attachedEmpleadoequipoListNew = new ArrayList<Empleadoequipo>();
            for (Empleadoequipo empleadoequipoListNewEmpleadoequipoToAttach : empleadoequipoListNew) {
                empleadoequipoListNewEmpleadoequipoToAttach = em.getReference(empleadoequipoListNewEmpleadoequipoToAttach.getClass(), empleadoequipoListNewEmpleadoequipoToAttach.getIdEmpEq());
                attachedEmpleadoequipoListNew.add(empleadoequipoListNewEmpleadoequipoToAttach);
            }
            empleadoequipoListNew = attachedEmpleadoequipoListNew;
            equipo.setEmpleadoequipoList(empleadoequipoListNew);
            equipo = em.merge(equipo);
            if (ordenreparacionidOrdenRepOld != null && !ordenreparacionidOrdenRepOld.equals(ordenreparacionidOrdenRepNew)) {
                ordenreparacionidOrdenRepOld.getEquipoList().remove(equipo);
                ordenreparacionidOrdenRepOld = em.merge(ordenreparacionidOrdenRepOld);
            }
            if (ordenreparacionidOrdenRepNew != null && !ordenreparacionidOrdenRepNew.equals(ordenreparacionidOrdenRepOld)) {
                ordenreparacionidOrdenRepNew.getEquipoList().add(equipo);
                ordenreparacionidOrdenRepNew = em.merge(ordenreparacionidOrdenRepNew);
            }
            if (clienteMayoristaidClienteMayOld != null && !clienteMayoristaidClienteMayOld.equals(clienteMayoristaidClienteMayNew)) {
                clienteMayoristaidClienteMayOld.getEquipoList().remove(equipo);
                clienteMayoristaidClienteMayOld = em.merge(clienteMayoristaidClienteMayOld);
            }
            if (clienteMayoristaidClienteMayNew != null && !clienteMayoristaidClienteMayNew.equals(clienteMayoristaidClienteMayOld)) {
                clienteMayoristaidClienteMayNew.getEquipoList().add(equipo);
                clienteMayoristaidClienteMayNew = em.merge(clienteMayoristaidClienteMayNew);
            }
            if (modeloidModeloOld != null && !modeloidModeloOld.equals(modeloidModeloNew)) {
                modeloidModeloOld.getEquipoList().remove(equipo);
                modeloidModeloOld = em.merge(modeloidModeloOld);
            }
            if (modeloidModeloNew != null && !modeloidModeloNew.equals(modeloidModeloOld)) {
                modeloidModeloNew.getEquipoList().add(equipo);
                modeloidModeloNew = em.merge(modeloidModeloNew);
            }
            if (gamaequipoidGamaOld != null && !gamaequipoidGamaOld.equals(gamaequipoidGamaNew)) {
                gamaequipoidGamaOld.getEquipoList().remove(equipo);
                gamaequipoidGamaOld = em.merge(gamaequipoidGamaOld);
            }
            if (gamaequipoidGamaNew != null && !gamaequipoidGamaNew.equals(gamaequipoidGamaOld)) {
                gamaequipoidGamaNew.getEquipoList().add(equipo);
                gamaequipoidGamaNew = em.merge(gamaequipoidGamaNew);
            }
            for (Equipofalla equipofallaListOldEquipofalla : equipofallaListOld) {
                if (!equipofallaListNew.contains(equipofallaListOldEquipofalla)) {
                    equipofallaListOldEquipofalla.setIdEquipo(null);
                    equipofallaListOldEquipofalla = em.merge(equipofallaListOldEquipofalla);
                }
            }
            for (Equipofalla equipofallaListNewEquipofalla : equipofallaListNew) {
                if (!equipofallaListOld.contains(equipofallaListNewEquipofalla)) {
                    Equipo oldIdEquipoOfEquipofallaListNewEquipofalla = equipofallaListNewEquipofalla.getIdEquipo();
                    equipofallaListNewEquipofalla.setIdEquipo(equipo);
                    equipofallaListNewEquipofalla = em.merge(equipofallaListNewEquipofalla);
                    if (oldIdEquipoOfEquipofallaListNewEquipofalla != null && !oldIdEquipoOfEquipofallaListNewEquipofalla.equals(equipo)) {
                        oldIdEquipoOfEquipofallaListNewEquipofalla.getEquipofallaList().remove(equipofallaListNewEquipofalla);
                        oldIdEquipoOfEquipofallaListNewEquipofalla = em.merge(oldIdEquipoOfEquipofallaListNewEquipofalla);
                    }
                }
            }
            for (Empleadoequipo empleadoequipoListOldEmpleadoequipo : empleadoequipoListOld) {
                if (!empleadoequipoListNew.contains(empleadoequipoListOldEmpleadoequipo)) {
                    empleadoequipoListOldEmpleadoequipo.setEquipoidEquipo(null);
                    empleadoequipoListOldEmpleadoequipo = em.merge(empleadoequipoListOldEmpleadoequipo);
                }
            }
            for (Empleadoequipo empleadoequipoListNewEmpleadoequipo : empleadoequipoListNew) {
                if (!empleadoequipoListOld.contains(empleadoequipoListNewEmpleadoequipo)) {
                    Equipo oldEquipoidEquipoOfEmpleadoequipoListNewEmpleadoequipo = empleadoequipoListNewEmpleadoequipo.getEquipoidEquipo();
                    empleadoequipoListNewEmpleadoequipo.setEquipoidEquipo(equipo);
                    empleadoequipoListNewEmpleadoequipo = em.merge(empleadoequipoListNewEmpleadoequipo);
                    if (oldEquipoidEquipoOfEmpleadoequipoListNewEmpleadoequipo != null && !oldEquipoidEquipoOfEmpleadoequipoListNewEmpleadoequipo.equals(equipo)) {
                        oldEquipoidEquipoOfEmpleadoequipoListNewEmpleadoequipo.getEmpleadoequipoList().remove(empleadoequipoListNewEmpleadoequipo);
                        oldEquipoidEquipoOfEmpleadoequipoListNewEmpleadoequipo = em.merge(oldEquipoidEquipoOfEmpleadoequipoListNewEmpleadoequipo);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = equipo.getIdEquipo();
                if (findEquipo(id) == null) {
                    throw new NonexistentEntityException("The equipo with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Equipo equipo;
            try {
                equipo = em.getReference(Equipo.class, id);
                equipo.getIdEquipo();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The equipo with id " + id + " no longer exists.", enfe);
            }
            Ordenreparacion ordenreparacionidOrdenRep = equipo.getOrdenreparacionidOrdenRep();
            if (ordenreparacionidOrdenRep != null) {
                ordenreparacionidOrdenRep.getEquipoList().remove(equipo);
                ordenreparacionidOrdenRep = em.merge(ordenreparacionidOrdenRep);
            }
            Clientemayorista clienteMayoristaidClienteMay = equipo.getClienteMayoristaidClienteMay();
            if (clienteMayoristaidClienteMay != null) {
                clienteMayoristaidClienteMay.getEquipoList().remove(equipo);
                clienteMayoristaidClienteMay = em.merge(clienteMayoristaidClienteMay);
            }
            Modelo modeloidModelo = equipo.getModeloidModelo();
            if (modeloidModelo != null) {
                modeloidModelo.getEquipoList().remove(equipo);
                modeloidModelo = em.merge(modeloidModelo);
            }
            Gamaequipo gamaequipoidGama = equipo.getGamaequipoidGama();
            if (gamaequipoidGama != null) {
                gamaequipoidGama.getEquipoList().remove(equipo);
                gamaequipoidGama = em.merge(gamaequipoidGama);
            }
            List<Equipofalla> equipofallaList = equipo.getEquipofallaList();
            for (Equipofalla equipofallaListEquipofalla : equipofallaList) {
                equipofallaListEquipofalla.setIdEquipo(null);
                equipofallaListEquipofalla = em.merge(equipofallaListEquipofalla);
            }
            List<Empleadoequipo> empleadoequipoList = equipo.getEmpleadoequipoList();
            for (Empleadoequipo empleadoequipoListEmpleadoequipo : empleadoequipoList) {
                empleadoequipoListEmpleadoequipo.setEquipoidEquipo(null);
                empleadoequipoListEmpleadoequipo = em.merge(empleadoequipoListEmpleadoequipo);
            }
            em.remove(equipo);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Equipo> findEquipoEntities() {
        return findEquipoEntities(true, -1, -1);
    }

    public List<Equipo> findEquipoEntities(int maxResults, int firstResult) {
        return findEquipoEntities(false, maxResults, firstResult);
    }

    private List<Equipo> findEquipoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Equipo as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Equipo findEquipo(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Equipo.class, id);
        } finally {
            em.close();
        }
    }

    public int getEquipoCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from Equipo as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
